/**
在 TypeScript 中，函数类型的表示方法用于定义函数的参数类型和返回值类型。通过清晰地指定函数的类型，可以提高代码的可读性和可维护性，减少潜在的错误。
  1. 基本函数类型表示
  最基本的函数类型表示方法是通过函数声明来定义函数的参数和返回值类型：
  function 函数名(参数名: 参数类型): 返回值类型 {
      // 函数体
  }
   示例：
  function add(a: number, b: number): number {
      return a + b;
  }
  2. 函数类型别名
  可以使用类型别名（type alias）来定义函数类型，这样可以在多个地方复用同一类型：
  type AddFunction = (a: number, b: number) => number;

  const add: AddFunction = (x, y) => {
      return x + y;
  };
  3. 可选参数
  使用  `?`  表示参数是可选的，调用时可以省略该参数：
  function greet(name: string, greeting?: string): string {
      return greeting ? `${greeting}, ${name}!` : `Hello, ${name}!`;
  }
  4. 默认参数
  可以为参数指定默认值，如果调用时没有提供该参数，则会使用默认值：
  function multiply(a: number, b: number = 1): number {
      return a * b;
  }
  5. 函数重载
  TypeScript 支持函数重载，可以为同一个函数定义多个签名，以支持不同的参数类型和数量：
  function combine(input1: string, input2: string): string;
  function combine(input1: number, input2: number): number;
  function combine(input1: any, input2: any): any {
      return input1 + input2;
  }
  6. 函数作为参数
  TypeScript 允许将函数作为参数传递，可以使用函数类型表示来定义参数类型：
  function processUserInput(callback: (input: string) => void) {
      const userInput = "Hello, TypeScript!";
      callback(userInput);
  }
  7. 返回函数
  可以定义一个返回函数的函数类型，通常用于工厂函数：
  function createCounter(): () => number {
      let count = 0;
      return () => {
          count++;
          return count;
      };
  }

  const counter = createCounter();
  console.log(counter()); // 输出: 1
  console.log(counter()); // 输出: 2
  8. 结论
  通过以上几种方法，TypeScript 提供了灵活且强大的函数类型表示方式。合理使用这些表示方法，可以帮助开发者编写出更安全、可读性更高的代码。在实际开发中，结合函数类型别名、可选参数、默认参数和函数重载等特性，可以有效提升代码的质量和可维护性。
 */
// 方案一: 函数类型表达式 function type expression
// 格式: (参数列表) => 返回值
type BarType = (num: number) => string

const bar: BarType = (num) => {
  return num.toString()
}

// 方案二: 接口 interface
interface BarInterface {
  (num: number): string
}

const bar2: BarInterface = (num) => {
  return num.toString()
}

// 方案三: 类型别名 type alias
type BarAlias = (num: number) => string
const bar3: BarAlias = (num) => {
  return num.toString()
}

export {}